home *** CD-ROM | disk | FTP | other *** search
- #include "GetFileIcon.h"
- #include "Folders.h"
-
-
- pascal OSErr GetFileIcon(FSSpec *thing, IconSelectorValue iconSelector, Handle *theSuite)
- {
-
- CInfoPBRec cpb;
- OSErr err;
-
- *theSuite = NULL;
-
- if(IsVolEjected(thing->vRefNum)) err=volOffLinErr;
- else
- {
- cpb.hFileInfo.ioVRefNum=thing->vRefNum;
- cpb.hFileInfo.ioDirID=thing->parID;
- cpb.hFileInfo.ioNamePtr=thing->name;
- cpb.hFileInfo.ioFDirIndex=0;
- err=PBGetCatInfoSync(&cpb);
-
- if(!err)
- if((cpb.hFileInfo.ioFlAttrib & ioDirMask)==0) err=GetNormalFileIcon(&cpb, iconSelector, theSuite);
- }
- return(err);
- }
-
-
-
- static Boolean IsVolEjected(short vRefNum)
- {
-
- OSErr err;
- HVolumeParam vol_pb;
-
- vol_pb.ioNamePtr=NULL;
- vol_pb.ioVRefNum=vRefNum;
- vol_pb.ioVolIndex=0;
- err=PBHGetVInfoSync((HParmBlkPtr)&vol_pb);
-
- return((err==noErr)&&(vol_pb.ioVDRefNum>0));
- }
-
-
-
- static OSErr GetNormalFileIcon(CInfoPBRec *cpb, IconSelectorValue iconSelector, Handle *theSuite)
- {
- OSErr err;
- long dataSize;
- Handle iconData;
- Byte iconType;
- GetIconData getData;
- short iconID;
- Boolean inFinder;
- short saveResFile, FinderResFile, sysVRefNum;
- long sysDirID;
- Str255 finderName;
- IconActionUPP getIconProcPtr;
-
- iconID=FindGenericIconID(cpb->hFileInfo.ioFlFndrInfo.fdType, &inFinder );
- saveResFile=CurResFile();
-
- if(inFinder)
- {
- FindFolder(kOnSystemDisk, kSystemFolderType, kDontCreateFolder, &sysVRefNum, &sysDirID);
- SetResLoad(false);
- GetFinderFilename(finderName);
- FinderResFile=HOpenResFile(sysVRefNum, sysDirID, finderName, fsRdPerm);
- SetResLoad(true);
- if(FinderResFile==-1) err=ResError();
- else
- {
- err=GetResourceIcons(theSuite, iconID, iconSelector);
- CloseResFile(FinderResFile);
- }
- }
- else
- {
- getData.DTRefNum=FindDesktopDatabase(cpb->dirInfo.ioVRefNum, cpb->hFileInfo.ioFlFndrInfo.fdCreator);
- if(getData.DTRefNum!=0)
- {
- err=NewIconSuite(theSuite);
- if(!err)
- {
- getData.fileCreator = cpb->hFileInfo.ioFlFndrInfo.fdCreator;
- getData.fileType = cpb->hFileInfo.ioFlFndrInfo.fdType;
- if(getData.fileType == kApplicationAliasType) getData.fileType='APPL';
- getIconProcPtr=NewIconActionProc(GetIconProc);
- err=ForEachIconDo(*theSuite, iconSelector, getIconProcPtr, &getData);
- DisposeRoutineDescriptor(getIconProcPtr);
- }
- }
- if((getData.DTRefNum==0) || IsSuiteEmpty(*theSuite))
- {
- UseResFile(0);
- err=GetResourceIcons(theSuite, iconID, iconSelector);
- }
- }
- UseResFile(saveResFile);
-
- return(err);
- }
-
-
-
- static void GetFinderFilename(StringPtr _finderFilename)
- {
-
- Str255 _defaultFinderFilename="\pFinder";
- StringPtr _lowMemFinderName;
-
- _lowMemFinderName = LMGetFinderName();
- if((_lowMemFinderName!=(StringPtr)nil)&&(_lowMemFinderName[0]>0)) BlockMove(_lowMemFinderName, _finderFilename, _lowMemFinderName[0]+1);
- else BlockMove(_defaultFinderFilename, _finderFilename, _defaultFinderFilename[0]+1);
- }
-
-
-
- static pascal OSErr GetIconProc(ResType theType, Handle *theIcon, void *yourDataPtr)
- {
-
- OSErr err;
- GetIconData *data;
- DTPBRec deskRec;
-
- err=noErr;
- data=(GetIconData *)yourDataPtr;
- *theIcon=NewHandle(kLarge8BitIconSize);
-
- if(!(*theIcon)) err=memFullErr;
- else
- {
- HLock(*theIcon);
-
- deskRec.ioDTRefNum = data->DTRefNum;
- deskRec.ioDTBuffer = **theIcon;
- deskRec.ioDTReqCount = kLarge8BitIconSize;
- deskRec.ioFileCreator = data->fileCreator;
- deskRec.ioFileType = data->fileType;
-
- switch(theType)
- {
- case large1BitMask:
- deskRec.ioIconType = kLargeIcon;
- break;
- case large4BitData:
- deskRec.ioIconType = kLarge4BitIcon;
- break;
- case large8BitData:
- deskRec.ioIconType = kLarge8BitIcon;
- break;
- case small1BitMask:
- deskRec.ioIconType = kSmallIcon;
- break;
- case small4BitData:
- deskRec.ioIconType = kSmall4BitIcon;
- break;
- case small8BitData:
- deskRec.ioIconType = kSmall8BitIcon;
- break;
- default:
- deskRec.ioIconType = 1000;
- break;
- }
-
- err=PBDTGetIconSync(&deskRec);
- if(err==noErr)
- {
- HUnlock(*theIcon);
- SetHandleSize(*theIcon, deskRec.ioDTActCount);
- }
- else
- {
- DisposeHandle(*theIcon);
- *theIcon=NULL;
- err=noErr;
- }
- }
- return(err);
- }
-
-
-
- static short FindDesktopDatabase(short firstVRefNum, OSType fileCreator)
- {
-
- OSErr err;
- VolumeParam vpb;
- short DTRefNum = 0;
-
- if(!InOneDesktop(firstVRefNum, fileCreator, &DTRefNum))
- {
- vpb.ioNamePtr=NULL;
- for(vpb.ioVolIndex=1; PBGetVInfoSync((ParmBlkPtr)&vpb)==noErr; ++vpb.ioVolIndex)
- {
- if(vpb.ioVRefNum == firstVRefNum) continue;
- if( InOneDesktop(vpb.ioVRefNum, fileCreator, &DTRefNum)) break;
- }
- }
- return(DTRefNum);
- }
-
-
-
- static Boolean InOneDesktop(short vRefNum, OSType fileCreator, short *dtRefNum)
- {
-
- OSErr err;
- DTPBRec deskRec;
- Boolean retVal;
-
- HParamBlockRec _myHPB;
- GetVolParmsInfoBuffer _infoBuffer;
-
- retVal=false;
- deskRec.ioNamePtr=NULL;
- deskRec.ioVRefNum=vRefNum;
-
- _myHPB.ioParam.ioNamePtr = (StringPtr)nil;
- _myHPB.ioParam.ioVRefNum = vRefNum;
- _myHPB.ioParam.ioBuffer = (Ptr)&_infoBuffer;
- _myHPB.ioParam.ioReqCount = sizeof(_infoBuffer);
- if(((err=PBHGetVolParms(&_myHPB,false))!=noErr) || ((_infoBuffer.vMAttrib&(1L<<bHasDesktopMgr))==0)) return(retVal);
- err=PBDTGetPath(&deskRec);
- if(!err)
- {
- deskRec.ioFileCreator=fileCreator;
- deskRec.ioIndex=1;
- do
- {
- deskRec.ioTagInfo=0;
- err=PBDTGetIconInfoSync(&deskRec);
- deskRec.ioIndex+=1;
- } while((err == noErr)&&(deskRec.ioIconType<=0));
-
- if(err==noErr)
- {
- retVal=true;
- *dtRefNum=deskRec.ioDTRefNum;
- }
- }
- return(retVal);
- }
-
-
-
- static pascal OSErr GetResourceIcons(Handle *theSuite, short theID, long theSelector)
- {
-
- OSErr err;
-
- err=Get1IconSuite(theSuite, theID, theSelector);
- if(err == noErr) err=CopyEachIcon(*theSuite);
- return(err);
- }
-
-
-
- static pascal OSErr CopyOneIcon(ResType theType, Handle *theIcon, void *yourDataPtr)
- {
-
- OSErr err;
-
- if(*theIcon!=NULL)
- {
- LoadResource(*theIcon);
- err=HandToHand(theIcon);
- if(err!=noErr) *theIcon=NULL;
- }
- return(noErr);
- }
-
-
-
- static OSErr CopyEachIcon(Handle theSuite)
- {
- IconActionUPP copyOneIconProc;
- OSErr err;
-
- copyOneIconProc=NewIconActionProc(CopyOneIcon);
- err=ForEachIconDo(theSuite, svAllAvailableData, copyOneIconProc, NULL);
- DisposeRoutineDescriptor(copyOneIconProc);
- return(err);
- }
-
-
-
- static short FindGenericIconID(OSType theType, Boolean *inFinder)
- {
-
- short id=genericDocumentIconResource;
- GenericIconInfo *_icon, *_endIcon;
-
- for(_icon=gGenericFinderIcons, _endIcon=_icon+sizeof(gGenericFinderIcons)/sizeof(GenericIconInfo);(_icon<_endIcon)&&(_icon->type!=theType);_icon++);
- if(!(*inFinder=(_icon<_endIcon)))
- for(_icon=gGenericSysIcons, _endIcon=_icon+sizeof(gGenericSysIcons)/sizeof(GenericIconInfo);(_icon<_endIcon)&&(_icon->type!=theType); _icon++);
- if(_icon<_endIcon) id=_icon->id;
- return(id);
- }
-
-
-
- static pascal OSErr Get1IconSuite(Handle *theSuite, short theID, long theSelector)
- {
-
- OSErr err;
- IconActionUPP get1IconProc;
-
- err=NewIconSuite(theSuite);
- if(!err)
- {
- get1IconProc=NewIconActionProc(Get1Icon);
- err=ForEachIconDo(*theSuite, theSelector, get1IconProc, &theID);
- DisposeRoutineDescriptor(get1IconProc);
- }
- return(err);
- }
-
-
-
- static pascal OSErr Get1Icon(ResType theType, Handle *theIcon, short *resID)
- {
-
- *theIcon = Get1Resource(theType, *resID);
-
- return( noErr );
- }
-
-
-
- static pascal OSErr TestHandle(ResType theType, Handle *theIcon, void *yourDataPtr)
- {
-
- if(*theIcon!=NULL) *(Boolean *)yourDataPtr=false;
-
- return( noErr );
- }
-
-
-
- Boolean IsSuiteEmpty(Handle theSuite)
- {
-
- Boolean retVal;
- IconActionUPP testHandleProc;
-
- testHandleProc=NewIconActionProc(TestHandle);
-
- retVal = true;
- ForEachIconDo(theSuite, svAllAvailableData, testHandleProc, &retVal);
- DisposeRoutineDescriptor(testHandleProc);
-
- return(retVal);
- }
-
-
-